package controllers.GestionTratamientoDatos;

import controllers.GestionTratamientoDatos.Metodos.Completacion.MetodoCompletacionBase;
import controllers.GestionTratamientoDatos.Metodos.Completacion.Metodos.Lsa;
import controllers.GestionTratamientoDatos.Metodos.Completacion.Metodos.cubicSplineH;
import controllers.GestionTratamientoDatos.Metodos.Correccion.MetodoCorreccionBase;
import controllers.GestionTratamientoDatos.Metodos.Correccion.Metodos.CorrelacionSimple;
import controllers.GestionTratamientoDatos.Metodos.Correccion.Metodos.InterpolacionLineal;
import controllers.GestionTratamientoDatos.Metodos.Verificacion.MetodoVerificacionBase;
import controllers.GestionTratamientoDatos.Metodos.Verificacion.Metodos.VerificacionIntervalosConsecutivos;
import controllers.GestionTratamientoDatos.Metodos.Verificacion.Metodos.VerificacionMediasMoviles;
import controllers.GestionTratamientoDatos.Metodos.Verificacion.Metodos.VerificacionVariacionPrecedente;
import models.*;
import org.apache.commons.collections.iterators.ArrayListIterator;
import play.mvc.Controller;

import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: Daniel
 * Date: 05/02/13
 * Time: 10:40 AM
 * To change this template use File | Settings | File Templates.
 */
public class GestorTratamientoDatos extends Controller {

    public static List <String> crearArbolCom (int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        // Código de los nodos padre del arbol de componentes hidráulicos.
        int nodoid =1;
        // Código de los nodos hijo del arbol de componentes hidráulicos.
        int nodoidpcom =0;
        // Código de los tipos de medición del componente hidráulico.
        int nodoidptipmed =0;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = new ArrayList<String>();
        // Elemento del arbol de componentes hidráulicos.
        String arbcompsele;
        // Lista de todos los componentes hidráulicos aptos para modelar una cuenca.
        List <Hidtipocomponente> modtipcomps = Hidtipocomponente.findAll();
        Iterator itrmodtipcomps = modtipcomps.iterator();
        // Llenado de los elementos del arbol de componentes hidráulicos.
        while (itrmodtipcomps.hasNext())
        {
            Hidtipocomponente modtipcompsele = (Hidtipocomponente)itrmodtipcomps.next();
            // nodeId | parentNodeId | nodeName | nodeUrl.
            arbcompsele = nodoid+"|"+"0|"+modtipcompsele.getTipcompnom().trim()+"|#";
            arbcomps.add(arbcompsele);
            nodoid++;
            arbcompsele ="";
            nodoidpcom =nodoid-1;
            List <Hidcomponente> modcomps = Hidcomponente.find("byModsimidAndTipcompid",idmodelo,modtipcompsele.getTipcompid()).fetch();
            Iterator itrmodcomps = modcomps.iterator();
            while (itrmodcomps.hasNext())
            {
                Hidcomponente modcompsele = (Hidcomponente)itrmodcomps.next();
                //System.out.println("          "+modcompsele.getCompnom());
                arbcompsele = nodoid+"|"+nodoidpcom+"|"+modcompsele.getCompnom().trim()+"|#";
                arbcomps.add(arbcompsele);
                nodoid++;
                arbcompsele ="";
                nodoidptipmed =nodoid-1;
                List <Hidpuntomonitoreo> modcompunmons = Hidpuntomonitoreo.find("byCompid",modcompsele.getCompid()).fetch();
                Iterator itrmodcompunmons = modcompunmons.iterator();
                while (itrmodcompunmons.hasNext())
                {
                    Hidpuntomonitoreo modcompunmonsele = (Hidpuntomonitoreo)itrmodcompunmons.next();
                    List<Hidtipomedicion> modcomptipmeds = modcompunmonsele.getHidtipopuntomonitoreo().getHidtipomedicions();
                    Iterator itrmodcomptipmeds = modcomptipmeds.iterator();
                    while (itrmodcomptipmeds.hasNext())
                    {
                        Hidtipomedicion modcomptipmedsele = (Hidtipomedicion)itrmodcomptipmeds.next();

                        arbcompsele = nodoid+"|"+nodoidptipmed+"|"+modcomptipmedsele.getTipmednom().trim()+"|#"+modcomptipmedsele.getTipmedid();
                        arbcomps.add(arbcompsele);
                        nodoid++;
                        arbcompsele ="";
                    }
                }
            }
        }
        return arbcomps;
    }
    public static void index(int id)
    {
        int idmodelo = id;
        render(idmodelo);
    }

    public static void index2(int id)
    {
        /**********************************************************************
        Actualizar estados antes de hacer el tratamiento de datos en bruto
        - Registros con estado 0 (ultimo año) pasan a ser 1 (pertenecen ahora
        a la data original)
        - Registros con estado 3 (corregidos) y tipo de registro 1 (originales)
        pasan a ser de tipo 2 (validos)
        **********************************************************************/
        List<Hidregistro> hidregistro = Hidregistro.find("regestval = ? order by regfech ASC", 0).fetch();
        for (int i = 0; i < hidregistro.size(); i++)
        {
            hidregistro.get(i).setRegestval(1);
            //hidregistro.get(i).save();
        }

        List<Hidregistro> hidregistro1 = Hidregistro.find("tipregid = ? and regestval = ? order by regfech ASC", 1,3).fetch();
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(2);
        for (int i = 0; i < hidregistro1.size(); i++)
        {
            hidregistro1.get(i).setHidtiporegistro(hidtiporegistro);
            //hidregistro1.get(i).save();
        }

        int idmodelo = id;
        render(idmodelo);
    }

    public static void index3(int id)
    {
        int idmodelo = id;
        render(idmodelo);
    }

    public static void MetodosVerificacionDatos(int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = crearArbolCom (idmodelo);
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
       // System.out.println("LIST COMPONENTES "+ componentesmod);
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void MetodosCorreccionDatos(int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = crearArbolCom (idmodelo);
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void MetodosCompletacionDatos(int id)
    {
        int idmodelo = id;
        List <String> arbcomps = crearArbolCom (idmodelo);
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void MetodosVerificacionDatosUltimoAnho(int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = crearArbolCom (idmodelo);
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void MetodosCorreccionDatosUltimoAnho(int id)
    {
        // Código del modelo de cuenca.
        int idmodelo = id;
        //  Lista componentes del arbol de componentes hidráulicos.
        //  El contenido de los elementos de la lista son : "nodeId | parentNodeId | nodeName | nodeUrl" .
        List <String> arbcomps = crearArbolCom (idmodelo);
        // Lista de todos los componentes presentes en el modelo de cuenca de "idmodelo".
        List <Hidcomponente> componentesmod = Hidcomponente.find("byModsimid",idmodelo).fetch();
        render(idmodelo,componentesmod,arbcomps);
    }

    public static void RealizarVerificacion(int idmod, String hidregistros, int metodoGeneracion, int idCompModSim, int idtipmedicion)
    {
        System.out.println("VERIFICACION idmod = "+idmod + " hidregistros = "+hidregistros + " metodoGeneracion = "+metodoGeneracion+" idCompModSim = "+idCompModSim+" idtipmedicion = "+idtipmedicion);
        int idmodelo = idmod;
        List <Hidtipomedicion> compstipmeds = new ArrayList<Hidtipomedicion>();
        Hidcomponente hidcomponente = Hidcomponente.findById(idCompModSim);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byCompid",hidcomponente.getCompid()).first();
        List<Hidtipomedicion> modcompotipmeds = hidpuntomonitoreo.getHidtipopuntomonitoreo().getHidtipomedicions();
        Iterator  itrmodcompotipmeds = modcompotipmeds.iterator();
        while (itrmodcompotipmeds.hasNext())
        {
            Hidtipomedicion itrmodcompotipmedsele = (Hidtipomedicion)itrmodcompotipmeds.next();
            if (idtipmedicion == 0)
                compstipmeds.add(itrmodcompotipmedsele);
            else
            if (itrmodcompotipmedsele.getTipmedid()==idtipmedicion)
                compstipmeds.add(itrmodcompotipmedsele);
        }
        Hidmetodo hidmetodo = Hidmetodo.findById(3);
        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        List<Hidregistro> hidregistrosSalidas = null;
        if(hidregistros != null && !hidregistros.equals(""))
        {
            Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipmedicion);
            String[] ides = hidregistros.split(",");
            hidregistrosSalidas = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicionAndRegestval",hidpuntomonitoreo,0, hidtipomedicion,1).fetch();
            String idsVerificados = "";
            boolean idAgregado = false;
            for (int j = 0; j < hidregistrosSalidas.size(); j++)
            {
                idAgregado = false;
                for (int i = 0; i < ides.length; i++)
                {
                    if(hidregistrosSalidas.get(j).getRegid() == Integer.valueOf(ides[i]))
                    {
                        hidregistrosSalidas.get(j).setRegval(999999);
                        idAgregado = true;
                    }
                }
                if(idAgregado == false)
                {
                    idsVerificados += hidregistrosSalidas.get(j).getRegid() + ",";
                }
            }
            render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas, idsVerificados, metodoGeneracion,compstipmeds, idtipmedicion);
        }
        render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas,compstipmeds,idtipmedicion);
    }

    public static void RealizarCorreccion(int id)
    {
        int idmodelo = id;
        int id1 = 1;
        Hidcomponente hidcomponente = Hidcomponente.findById(id1);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byHidcomponente", hidcomponente).first();
        Hidmetodo hidmetodo = Hidmetodo.findById(1);
        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        render(idmodelo, hidpuntomonitoreo, idTipoMetodo);
    }

    public static void RealizarVerificacionUltimoAnho(int id, String hidregistros, int metodoGeneracion, int idtipomedicion)
    {
        int idmodelo = id;
        int id1 = 1;
        Hidcomponente hidcomponente = Hidcomponente.findById(id1);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byHidcomponente", hidcomponente).first();
        Hidmetodo hidmetodo = Hidmetodo.findById(3);
        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        List<Hidregistro> hidregistrosSalidas = null;
        if(hidregistros != null)
        {
            String[] ides = hidregistros.split(",");
            Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipomedicion);
            //seleccionar los datos del ultimo año
            hidregistrosSalidas = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndRegestvalAndHidtipomedicion",hidpuntomonitoreo,0, 0, hidtipomedicion).fetch();
            /*******************/
            String idsVerificados = "";
            boolean idAgregado = false;
            for (int j = 0; j < hidregistrosSalidas.size(); j++)
            {
                idAgregado = false;
                for (int i = 0; i < ides.length; i++)
                {
                    if(hidregistrosSalidas.get(j).getRegid() == Integer.valueOf(ides[i]))
                    {
                        hidregistrosSalidas.get(j).setRegval(999999);
                        idAgregado = true;
                    }
                }
                if(idAgregado == false)
                {
                    idsVerificados += hidregistrosSalidas.get(j).getRegid() + ",";
                }
            }
            render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas, idsVerificados, metodoGeneracion, idtipomedicion);
        }
        render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas);
    }

    public static void RealizarCorreccionUltimoAnho(int id)
    {
        int idmodelo = id;
        int id1 = 1;
        Hidcomponente hidcomponente = Hidcomponente.findById(id1);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byHidcomponente", hidcomponente).first();
        Hidmetodo hidmetodo = Hidmetodo.findById(1);
        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        render(idmodelo, hidpuntomonitoreo, idTipoMetodo);
    }


    public static void RealizarCompletacion2(int idmod, String hidregistros, int metodoGeneracion, int idCompModSim, int idtipmedicion, int idpuntomonitoreo){

        List<Hidregistro> lr = new ArrayList<Hidregistro>();

        System.out.println("HID REGISTROS + "+hidregistros);
        String[] listid = hidregistros.split(",");
        for(String s :listid){
            Hidregistro reg = Hidregistro.findById(Integer.parseInt(s));
            lr.add(reg);
        }

        System.out.println("idmod = "+idmod +" metodogeneracion"+metodoGeneracion+ " idCompModsim = " + idCompModSim + "idtipomedicion = "+idtipmedicion+ "hidpuntomonitoreo"+ idpuntomonitoreo);

        int idmodelo = idmod;
        List <Hidtipomedicion> compstipmeds = new ArrayList<Hidtipomedicion>();

        Hidcomponente hidcomponente = Hidcomponente.findById(idCompModSim);

        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byCompid",hidcomponente.getCompid()).first();
        List<Hidtipomedicion> modcompotipmeds = hidpuntomonitoreo.getHidtipopuntomonitoreo().getHidtipomedicions();
        Iterator  itrmodcompotipmeds = modcompotipmeds.iterator();

        while (itrmodcompotipmeds.hasNext())
        {
            Hidtipomedicion itrmodcompotipmedsele = (Hidtipomedicion)itrmodcompotipmeds.next();
            if (idtipmedicion == 0)
                compstipmeds.add(itrmodcompotipmedsele);
            else
            if (itrmodcompotipmedsele.getTipmedid()==idtipmedicion)
                compstipmeds.add(itrmodcompotipmedsele);
        }

        Hidmetodo hidmetodo = Hidmetodo.findById(7);
        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        List<Hidregistro> hidregistrosSalidas = null;
        if(hidregistros != null && !hidregistros.equals(""))
        {
            Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipmedicion);
            String[] ides = hidregistros.split(",");
            hidregistrosSalidas = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicionAndRegestval",hidpuntomonitoreo,0, hidtipomedicion,1).fetch();
            String idsVerificados = "";
            boolean idAgregado = false;
            for (int j = 0; j < hidregistrosSalidas.size(); j++)
            {
                idAgregado = false;
                for (int i = 0; i < ides.length; i++)
                {
                    if(hidregistrosSalidas.get(j).getRegid() == Integer.valueOf(ides[i]))
                    {
                        hidregistrosSalidas.get(j).setRegval(999999);
                        idAgregado = true;
                    }
                }
                if(idAgregado == false)
                {
                    idsVerificados += hidregistrosSalidas.get(j).getRegid() + ",";
                }
            }
            render(idmodelo, hidpuntomonitoreo, idTipoMetodo, lr, idsVerificados, metodoGeneracion,compstipmeds, idtipmedicion);
        }

        render(idmodelo, hidpuntomonitoreo, idTipoMetodo, lr,compstipmeds,idtipmedicion);

    }



    public static void RealizarCompletacion(int idmod, String hidregistros, int metodoGeneracion, int idCompModSim, int idtipmedicion, int idpuntomonitoreo, Vector<Double> vv){

        System.out.println("idmod = "+idmod +" metodogeneracion"+metodoGeneracion+ " idCompModsim = " + idCompModSim + "idtipomedicion = "+idtipmedicion+ "hidpuntomonitoreo"+ idpuntomonitoreo);

        int idmodelo = idmod;
        List <Hidtipomedicion> compstipmeds = new ArrayList<Hidtipomedicion>();

        Hidcomponente hidcomponente = Hidcomponente.findById(idCompModSim);

        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byCompid",hidcomponente.getCompid()).first();
        List<Hidtipomedicion> modcompotipmeds = hidpuntomonitoreo.getHidtipopuntomonitoreo().getHidtipomedicions();
        Iterator  itrmodcompotipmeds = modcompotipmeds.iterator();

        while (itrmodcompotipmeds.hasNext())
        {
            Hidtipomedicion itrmodcompotipmedsele = (Hidtipomedicion)itrmodcompotipmeds.next();
            if (idtipmedicion == 0)
                compstipmeds.add(itrmodcompotipmedsele);
            else
            if (itrmodcompotipmedsele.getTipmedid()==idtipmedicion)
                compstipmeds.add(itrmodcompotipmedsele);
        }

        Hidmetodo hidmetodo =null;
        if(metodoGeneracion!=0){
            hidmetodo = Hidmetodo.findById(metodoGeneracion);
        }else{
            hidmetodo = Hidmetodo.findById(7);
        }

        int idTipoMetodo = hidmetodo.getHidtipometodo().getTipmetid();
        List<Hidregistro> hidregistrosSalidas = new ArrayList<Hidregistro>();



        if(hidregistros!=null && !hidregistros.equals(""))
        {
            //List<Hidregistro> hidregistrosSalidas =new ArrayList<Hidregistro>();
            Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipmedicion);
            String[] ides = hidregistros.split(",");
           // hidregistrosSalidas = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicionAndRegestval",hidpuntomonitoreo,0, hidtipomedicion,1).fetch();

            for(String s :ides){
                Hidregistro reg = Hidregistro.findById(Integer.parseInt(s));
                hidregistrosSalidas.add(reg);
            }

            System.out.println("VECTOR VV "+ vv);
            System.out.println("REGISTROS SALIDAS TRATAMIENTO");
            for(int i=0; i<hidregistrosSalidas.size(); i++){
                System.out.print(hidregistrosSalidas.get(i).getRegval()+" ");

            }
            List<String[]> hidregistrosSalidas2= new ArrayList<String[]>();
            Calendar calendar = Calendar.getInstance();
            for (int d=0;d<hidregistrosSalidas.size();d++)
            {   String[] dat=new String[2]; int an=2004;
                    //Date datafech= new Date();
                    //datafech=hidregistrosSalidas.get(d).getRegfech();
                int aniomodf;
                String anstr=(hidregistrosSalidas.get(d).getRegfech()).toString();
                String response=anstr.substring(4,anstr.length());
                aniomodf=Integer.parseInt(anstr.substring(0,4))+1;
                response=aniomodf+response;

                    //datafech.setYear(datafech.getYear()+1);
                       String as= response+ "/" +
                                hidregistrosSalidas.get(d).getRegval() + "//" +
                                hidregistrosSalidas.get(d).getHidtipomedicion().getTipmedid() + ":" +
                                hidregistrosSalidas.get(d).getHidtiporegistro().getTipregid()+ ":" +
                               hidregistrosSalidas.get(d).getRegtipmet();
                System.out.println(as);
                dat[1]=as;
                dat[0]=""+hidregistrosSalidas.get(d).getRegid()+"";

                hidregistrosSalidas2.add(dat);

            }
            //hidregistrosSalidas2.add(24,new Hidregistro());
            //System.out.println("listas de registros222: " + hidregistrosSalidas2.get(1).getRegid());



            int indice=0;
            for(Hidregistro h : hidregistrosSalidas){
                h.setRegval(vv.get(indice));
                indice++;
            }



            System.out.println("REGISTROS SALIDAS "+ hidregistrosSalidas);
            for(int i=0; i<hidregistrosSalidas.size(); i++){
            System.out.println("REGISTROS SALIDAS2 "+ hidregistrosSalidas2.get(i));
            }
            render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas,hidregistrosSalidas2, metodoGeneracion, compstipmeds, idtipmedicion);
        }
        hidregistrosSalidas=null;
        System.out.println("REGISTROS SALIDAS 2222222222"+ hidregistrosSalidas);
        render(idmodelo, hidpuntomonitoreo, idTipoMetodo, hidregistrosSalidas,compstipmeds,idtipmedicion);

    }

    /* String idsVerificados = "";
            boolean idAgregado = false;
            for (int j = 0; j < hidregistrosSalidas2.size(); j++)
            {
                idAgregado = false;
                for (int i = 0; i < ides.length; i++)
                {
                    if(hidregistrosSalidas2.get(j).getRegid() == Integer.valueOf(ides[i]))
                    {
                        hidregistrosSalidas2.get(j).setRegval(999999);
                        idAgregado = true;
                    }
                }
                if(idAgregado == false)
                {
                    idsVerificados += hidregistrosSalidas2.get(j).getRegid() + ",";
                }
            }*/


    public static void Corregir(int idmodelo, int metodoGeneracion, int idpuntomonitoreo, int idtipomedicion, int idtiporegistro, int idMetodoVerificacion)
    {
        /*System.out.println("modelo: " + idmodelo + " mtdGen: " + metodoGeneracion +
                           " ptomon: " + idpuntomonitoreo + " tipmed: " + idtipomedicion +
                           " tipreg: " + idtiporegistro + " metVer: " + idMetodoVerificacion);*/

        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.findById(idpuntomonitoreo);
        Hidmetodo hidmetodoVerificacion = Hidmetodo.findById(idMetodoVerificacion);
        Hidmetodo hidmetodoCorrecion = Hidmetodo.findById(metodoGeneracion);
        Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipomedicion);
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(idtiporegistro);
        List<Hidregistro> hidregistro = Hidregistro.find("punmonid = ? and tipmedid = ? and regtipmet = ? and tipregid = ? order by regfech ASC",
                idpuntomonitoreo, idtipomedicion, idMetodoVerificacion, 2).fetch();
        if(hidregistro.size() > 0)
        {
            MetodoCorreccionBase metodoCorreccion;
            switch (metodoGeneracion)
            {
                case 1:
                    metodoCorreccion = new InterpolacionLineal(hidregistro, 1);
                    break;
                default:
                    metodoCorreccion = new InterpolacionLineal(hidregistro, 1);
                    break;
            }
            metodoCorreccion.Corregir();
            List<Hidregistro> hidregistrosSalidas = metodoCorreccion.getSerieSalida();
            List<Hidregistro> hidregistrosEliminar = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicion",hidpuntomonitoreo, metodoGeneracion, hidtipomedicion).fetch();
            if(hidregistrosEliminar.size() > 0)
            {
                for (int i = 0; i < hidregistrosEliminar.size(); i++)
                {
                    hidregistrosEliminar.get(i).delete();
                }
            }
            for (int i = 0; i < hidregistrosSalidas.size(); i++)
            {
                //en caso no se haya cambiado del estado 1 a 3
                hidregistrosSalidas.get(i).setRegestval(3);
                hidregistrosSalidas.get(i).save();
            }
            render(idmodelo, hidpuntomonitoreo, hidmetodoVerificacion, hidtipomedicion, hidmetodoCorrecion, hidregistrosSalidas);
        }
        RealizarCorreccion(idmodelo);
    }


    public static void Completar22(int idmodelo,int idpuntomonitoreo,  int idtipomedicion, int idtiporegistro, int idMetodoCompletacion,  String registrosPrueba, String idregistrosPrueba){

        System.out.println("COMPLETAR 22 idmod = "+idmodelo +" metodoCompletacion = "+idMetodoCompletacion+ " idtipomedicion = "+idtipomedicion+ "hidpuntomonitoreo"+ idpuntomonitoreo);

        //List<Hidregistro> registros = Hidregistro.find("punmonid = ? and tipmedid = ? order by regfech ASC",idpuntomonitoreo,idtipomedicion).fetch();
        List<Hidregistro> registros= new ArrayList<Hidregistro>();




        Hidpuntomonitoreo hpm = Hidpuntomonitoreo.findById(idpuntomonitoreo);
        int idcompmodsim= hpm.getHidcomponente().getCompid();

        MetodoCompletacionBase metodoCompletacion = null;

        String[] list = registrosPrueba.split(",");

        Vector<Double> seri=new Vector<Double>();
        for(String as:list)
        {

            seri.add(new Double(as));
        }

        switch (idMetodoCompletacion){
            case 7:
                metodoCompletacion = new Lsa(seri);
                break;

            case 8:
                 metodoCompletacion = new cubicSplineH(seri);
                break;

            default:
                metodoCompletacion = new Lsa(seri);
                break;

        }
        metodoCompletacion.completar();
        Vector<Double> vectorsalida = metodoCompletacion.getSerieVector();

        System.out.println("SALIDA CUBIC "+vectorsalida);

        String[] listid = idregistrosPrueba.split(",");
        int indice=0;

        for(String s :listid){
            Hidregistro reg = Hidregistro.findById(Integer.parseInt(s));
            reg.setRegval(vectorsalida.get(indice));
            registros.add(reg);
            indice++;
        }

        System.out.println("REGISTROS ANTES DE REALIZAR "+registros);
        Vector<Double> vv = metodoCompletacion.getSerieVector();

        RealizarCompletacion(idmodelo, idregistrosPrueba, idMetodoCompletacion, idcompmodsim, idtipomedicion, idpuntomonitoreo,vv);
       // RealizarCompletacion(idmodelo,idregistrosPrueba, idmetodoCompletacion, idtipomedicion,1, idpuntomonitoreo);

    }

    public static void Completar2(int idmodelo, int metodoGeneracion, int idpuntomonitoreo, int idtipomedicion, int idtiporegistro, String registrosPrueba, String idregistrosPrueba){

       System.out.println("idmod = "+idmodelo +" metodogeneracion"+metodoGeneracion+ "dtipomedicion = "+idtipomedicion+ "hidpuntomonitoreo"+ idpuntomonitoreo);
       MetodoCompletacionBase metodoCompletacion = null;

        System.out.println("REGISTROS "+registrosPrueba);
        System.out.println("REGSTROS IDS "+idregistrosPrueba);
       String[] list = registrosPrueba.split(",");

        System.out.println("LISTA "+list);
       Vector<Double> seri=new Vector<Double>();
       for(String as:list)
       {

          seri.add(new Double(as));
       }

        System.out.println("SEERIE"+seri);

        switch (metodoGeneracion){
            case 7:
                metodoCompletacion = new Lsa(seri);
                break;

            case 8:
            //    metodoCompletacion = new cubicSplineH();
                break;

            default:
                metodoCompletacion = new Lsa(seri);
                break;

        }
        metodoCompletacion.completar();

        //RealizarCompletacion(idmodelo,idregistrosPrueba,metodoGeneracion,idcompmodsim,idtipomedicion,idpuntomonitoreo);
        //RealizarCompletacion(idmodelo,idregistrosPrueba, metodoGeneracion, idtipomedicion,1, idpuntomonitoreo);

    }



    public static void Verificar(int idmodelo, int metodoGeneracion, int idpuntomonitoreo, int idtipomedicion, int idtiporegistro, int anhoTratamiento)
    {
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(idtiporegistro);
        List<Hidregistro> hidregistro = Hidregistro.find("punmonid = ? and tipmedid = ? and regtipmet = ? and regestval = ? order by regfech ASC",
                idpuntomonitoreo, idtipomedicion, idtiporegistro, 1).fetch();
        MetodoVerificacionBase metodoVerificacion;
        String registroSalida = "";
        if(hidregistro.size() > 0)
        {
            switch (metodoGeneracion)
            {
                case 3:
                    metodoVerificacion = new VerificacionMediasMoviles(hidregistro, 3, 7);
                    break;
                case 4:
                    metodoVerificacion = new VerificacionVariacionPrecedente(hidregistro, 2);
                    break;
                default:
                    metodoVerificacion = new VerificacionIntervalosConsecutivos(hidregistro, 3, 7);
                    break;
            }
            metodoVerificacion.Verificar();
            for (int i = 0; i < metodoVerificacion.getSerieSalida().size(); i++)
            {
                registroSalida += metodoVerificacion.getSerieSalida().get(i).getRegid() + ",";
            }
        }

        System.out.println("REGISTROS SALIDA : \n"+ registroSalida);
        RealizarVerificacion(idmodelo,registroSalida, metodoGeneracion, idtipomedicion,1);
    }

    public static void CorregirUltimoAnho(int idmodelo, int metodoGeneracion, int idpuntomonitoreo, int idtipomedicion, int idtiporegistro, int idMetodoVerificacion)
    {
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.findById(idpuntomonitoreo);
        Hidmetodo hidmetodoVerificacion = Hidmetodo.findById(idMetodoVerificacion);
        Hidmetodo hidmetodoCorrecion = Hidmetodo.findById(metodoGeneracion);
        Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipomedicion);
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(idtiporegistro);
        List<Hidregistro> hidregistro = Hidregistro.find("punmonid = ? and tipmedid = ? and regtipmet = ? and tipregid = ? order by regfech ASC",
                idpuntomonitoreo, idtipomedicion, idMetodoVerificacion, 1).fetch();

        if(hidregistro.size() > 0)
        {
            MetodoCorreccionBase metodoCorreccion;
            switch (metodoGeneracion)
            {
                case 1:
                    metodoCorreccion = new InterpolacionLineal(hidregistro, 1);
                    break;
                default:
                    metodoCorreccion = new CorrelacionSimple(hidregistro, 1);
                    break;
            }
            metodoCorreccion.Corregir();

            List<Hidregistro> hidregistrosSalidas = metodoCorreccion.getSerieSalida();

            Hidtiporegistro hidtiporegistroElim = Hidtiporegistro.findById(1);
            List<Hidregistro> hidregistrosEliminar = Hidregistro.find("byHidpuntomonitoreoAndRegestvalAndHidtipomedicionAndHidtiporegistro",
                                                                      hidpuntomonitoreo, 3, hidtipomedicion, hidtiporegistroElim).fetch();

            //System.out.print("ptomon: " + idpuntomonitoreo + " metGen: " + metodoGeneracion + " tipmed: " + idtipomedicion + "tiporeg: 1");

            if(hidregistrosEliminar.size() > 0)
            {
                for (int i = 0; i < hidregistrosEliminar.size(); i++)
                {
                    hidregistrosEliminar.get(i).delete();
                }
            }

            for (int i = 0; i < hidregistrosSalidas.size(); i++)
            {
                //en caso no se haya cambiado del estado 1 a 3
                hidregistrosSalidas.get(i).setRegestval(3);
                hidregistrosSalidas.get(i).save();
            }

            render(idmodelo, hidpuntomonitoreo, hidmetodoVerificacion, hidtipomedicion, hidmetodoCorrecion, hidregistrosSalidas);
        }
        RealizarCorreccionUltimoAnho(idmodelo);

    }

    public static void VerificarUltimoAnho(int idmodelo, int metodoGeneracion, int idpuntomonitoreo, int idtipomedicion, int idtiporegistro, int anhoTratamiento)
    {
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(idtiporegistro);
        List<Hidregistro> hidregistro = Hidregistro.find("punmonid = ? and tipmedid = ? and regtipmet = ? and regestval = ? order by regfech ASC",
                idpuntomonitoreo, idtipomedicion, 1, 3).fetch();

        if(hidregistro.size() > 0)
        {
            List<Hidregistro> hidregistroUltimoAnho = Hidregistro.find("punmonid = ? and tipmedid = ? and regtipmet = ? and regestval = ? order by regfech ASC",
                    idpuntomonitoreo, idtipomedicion, idtiporegistro, 0).fetch();

            if(hidregistroUltimoAnho.size() > 0)
            {
                MetodoVerificacionBase metodoVerificacion;
                String registroSalida = "";

                switch (metodoGeneracion)
                {
                    case 3:
                        metodoVerificacion = new VerificacionMediasMoviles(hidregistro, 3, 7);
                        break;
                    case 4:
                        metodoVerificacion = new VerificacionVariacionPrecedente(hidregistro, 2);
                        break;
                    default:
                        metodoVerificacion = new VerificacionIntervalosConsecutivos(hidregistro, 3, 7);
                        break;
                }
                metodoVerificacion.setSerieUltimoAnho(hidregistroUltimoAnho);
                metodoVerificacion.VerificarUltimoAnho();


                for (int i = 0; i < metodoVerificacion.getSerieSalida().size(); i++)
                {
                    registroSalida += metodoVerificacion.getSerieSalida().get(i).getRegid() + ",";
                }

                /* Cambiamos el estado de los registros del ultimo año de 1 a 2 */
                /*for (int i = 0; i < hidregistroUltimoAnho.size(); i++)
                {
                    hidregistroUltimoAnho.get(i).setRegestval(2);
                    //hidregistroUltimoAnho.get(i).save();
                }*/

                RealizarVerificacionUltimoAnho(idmodelo, registroSalida, metodoGeneracion, idtipomedicion);
            }
            RealizarVerificacionUltimoAnho(idmodelo, null, metodoGeneracion, idtipomedicion);
        }
        RealizarVerificacionUltimoAnho(idmodelo, null, metodoGeneracion, idtipomedicion);
    }

    public static void GuardarSerieVerificada(String idsRegistrosVerificados, int idGPuntomonitoreo, int idGModelo, int idGmetodoGeneracion, int idtipomedicionverificacion)
    {
        String delimitador = ",";
        String[] idsregistros = idsRegistrosVerificados.split(delimitador);

        int id1 = 1;
        Hidcomponente hidcomponente = Hidcomponente.findById(id1);
        Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipomedicionverificacion);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byHidcomponente", hidcomponente).first();
        Hidtiporegistro hidtiporegistro1 = Hidtiporegistro.findById(2);

        List<Hidregistro> hidregistros = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicionAndHidtiporegistro",hidpuntomonitoreo, idGmetodoGeneracion, hidtipomedicion, hidtiporegistro1).fetch();
        if(hidregistros.size() > 0)
        {
            for (int i = 0; i < hidregistros.size(); i++)
            {
                hidregistros.get(i).delete();
            }
        }

        for (int i = 0; i < idsregistros.length; i++)
        {
            Hidregistro hidregistro =  Hidregistro.findById(Integer.valueOf(idsregistros[i]));

            //tipo validado
            Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(2);

            Hidregistro hidregistroNuevo = new Hidregistro(0, hidregistro.getHidtipomedicion(), hidtiporegistro,
                                                           hidregistro.getHidpuntomonitoreo(), hidregistro.getRegfech(), hidregistro.getRegval(),
                                                           new Date(), idGmetodoGeneracion, 2);
            hidregistroNuevo.save();
        }

        Hidmetodo hidmetodo = Hidmetodo.findById(idGmetodoGeneracion);

        render(hidpuntomonitoreo, hidmetodo);
    }

    public static void GuardarSerieVerificadaUltimoAnho(String idsRegistrosVerificados, int idGPuntomonitoreo, int idGModelo, int idGmetodoGeneracion, int idtipomedicionverificacion)
    {
        String delimitador = ",";
        String[] idsregistros = idsRegistrosVerificados.split(delimitador);

        int id1 = 1;
        Hidcomponente hidcomponente = Hidcomponente.findById(id1);
        Hidtipomedicion hidtipomedicion = Hidtipomedicion.findById(idtipomedicionverificacion);
        Hidpuntomonitoreo hidpuntomonitoreo = Hidpuntomonitoreo.find("byHidcomponente", hidcomponente).first();
        Hidtiporegistro hidtiporegistro = Hidtiporegistro.findById(1);

        List<Hidregistro> hidregistros = Hidregistro.find("byHidpuntomonitoreoAndRegtipmetAndHidtipomedicionAndHidtiporegistro",
                                                           hidpuntomonitoreo, idGmetodoGeneracion, hidtipomedicion, hidtiporegistro).fetch();

        if(hidregistros.size() > 0)
        {
            for (int i = 0; i < hidregistros.size(); i++)
            {
                hidregistros.get(i).delete();
            }
        }

        for (int i = 0; i < idsregistros.length; i++)
        {
            Hidregistro hidregistro =  Hidregistro.findById(Integer.valueOf(idsregistros[i]));
            Hidregistro hidregistroNuevo = new Hidregistro(0, hidregistro.getHidtipomedicion(), hidregistro.getHidtiporegistro(),
                                                           hidregistro.getHidpuntomonitoreo(), hidregistro.getRegfech(), hidregistro.getRegval(),
                                                           new Date(), idGmetodoGeneracion, 2);
            hidregistroNuevo.save();
        }

        Hidmetodo hidmetodo = Hidmetodo.findById(idGmetodoGeneracion);

        render(hidpuntomonitoreo, hidmetodo);
    }
}
